﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Dominio;
using Persistencia;
using LogicaNegocios.Exceptions;
using System.Data.SqlClient;

namespace LogicaNegocios.Manager
{
    public class UsuarioManager
    {
        private static UsuarioManager _manager;

        #region Singleton
        public static UsuarioManager GetManager()
        {
            if (_manager == null)
            {
                _manager = new UsuarioManager();
            }
            return _manager;
        }
        #endregion


        public Usuario Login(string usrName, string pass)
        {
            Usuario usuario = null;

            List<Usuario> usuarios = GetUsuarios();

            foreach (Usuario aux in usuarios)
            {
                if (aux.NombreUsuario.Equals(usrName) && aux.Password.Equals(pass))
                {
                    usuario = aux;
                    break;
                }
            }

            return usuario;
        }


        public List<Usuario> GetUsuariosSeguidores(int idParticipante)
        {
            try
            {

                UsuarioPersistencia up = new UsuarioPersistencia();
                return up.UsuariosSiguenParticipante(idParticipante);
            }
            catch (Exception ex) { throw ex; }

        }

        public void CrearUsuario(Usuario usuario)
        {

            try
            {
                UsuarioPersistencia persistencia = new UsuarioPersistencia();

                Usuario existente = persistencia.GetUsuario(usuario.NombreUsuario);

                if (existente == null)
                {
                    persistencia.InsertarUsuario(usuario);
                }
                else
                {
                    throw new UsuarioExcpetion(UsuarioExcpetion.USUARIO_EXISTENTE);
                }
            }
            catch (SqlException)
            {
                throw new DBException(DBException.ERROR_DB);
            }
        }

        public void ModificarUsuario(Usuario usuario)
        {
            try
            {
                UsuarioPersistencia persistencia = new UsuarioPersistencia();

                Usuario existente = persistencia.GetUsuario(usuario.NombreUsuario);

                if (existente == null || usuario.Id == existente.Id)
                {
                    persistencia.ModificarUsuario(usuario);
                }
                else
                {
                    throw new UsuarioExcpetion(UsuarioExcpetion.USUARIO_EXISTENTE);
                }
            }
            catch (SqlException)
            {
                throw new DBException(DBException.ERROR_DB);
            }
        }

        public bool esAdmin(Usuario usuario)
        {
            bool esAdmin = false;
            if (usuario.Roles != null && usuario.Roles.Count == 1)
            {
                esAdmin = usuario.Roles[0].Tipo == "Administrador";
            }
            return esAdmin;
        }

        public bool esAdminSeguidor(Usuario usuario)
        {
            return usuario.Roles != null && usuario.Roles.Count > 1;

        }

        public bool esSeguidor(Usuario usuario)
        {
            bool esSeguidor = false;
            if (usuario.Roles != null && usuario.Roles.Count == 1)
            {
                esSeguidor = usuario.Roles[0].Tipo == "Seguidor";
            }
            return esSeguidor;
        }

        public bool noTieneRol(Usuario usuario)
        {
            return (usuario.Roles == null || usuario.Roles.Count == 0);
        }
        public void EliminarUsuario(Usuario usuario)
        {
            try
            {
                UsuarioPersistencia persistencia = new UsuarioPersistencia();
                persistencia.EliminarUsuario(usuario);

            }
            catch (SqlException)
            {
                throw new DBException(DBException.ERROR_DB);
            }
        }

        public Usuario GetUsuario(string nombreUsuario)
        {
            Usuario usuario = null;
            try
            {
                UsuarioPersistencia persistencia = new UsuarioPersistencia();
                usuario = persistencia.GetUsuario(nombreUsuario);
            }
            catch (SqlException)
            {
                throw new DBException(DBException.ERROR_DB);
            }
            return usuario;


        }

        public List<Usuario> GetUsuarios()
        {
            List<Usuario> usuarios = null;

            try
            {
                UsuarioPersistencia persistencia = new UsuarioPersistencia();
                usuarios = persistencia.GetAllUsers();
            }
            catch (SqlException)
            {
                throw new DBException(DBException.ERROR_DB);
            }

            return usuarios;
        }

        public List<Rol> getRoles()
        {
            List<Rol> roles = null;
            try
            {
                UsuarioPersistencia persistencia = new UsuarioPersistencia();
                roles = persistencia.GetAllRoles();
            }
            catch (SqlException)
            {
                throw new DBException(DBException.ERROR_DB);
            }

            return roles;
        }

        public Rol getRolByRolID(int rolID)
        {
            Rol rol = null;
            try
            {
                UsuarioPersistencia persistencia = new UsuarioPersistencia();

                rol = persistencia.GetRolByID(rolID);
            }
            catch (SqlException)
            {
                throw new DBException(DBException.ERROR_DB);
            }

            return rol;
        }

        public List<Rol> getRolesByUserID(int userID)
        {
            List<Rol> roles = null;
            try
            {
                UsuarioPersistencia persistencia = new UsuarioPersistencia();

                roles = persistencia.GetRolesByUserID(userID);
            }
            catch (SqlException)
            {
                throw new DBException(DBException.ERROR_DB);
            }

            return roles;
        }

    }
}
